iT邦幫忙

2024 iThome 鐵人賽

DAY 9
2

前兩天我們成功使用官網的教學來部署 GitLab 在以 kind 所建立的 Kubernetes Cluster 上。

Docker

準備環境的過程中,我們使用了 Colima 來提供 Docker 服務,這時讓我開始思考,**為什麼就一定要 Colima?**是因為 Rosetta 的關係嗎?還是 Arm64 的問題?

Rosetta?

我檢查 Docker Desktop,發現 Use Rosetta for x86_64/amd64 emulation on Apple Silicon 存在這個選項,而它也是被打勾的,所以我排除是 Rosetta 的原因造成無法部署。

Arm64?

在下載 Docker Desktop 時,就已經選擇 Arm64 的版本了,所以依然不認為是這個原因。

而不死心的我決定繼續實驗下去~

kind

官網的範例中,主要的差異是在 Control-Plane Node 上會映射 ContainerPort 到 HostPort 上,來讓我們可以直接透過主機存取 Kubernetes 內部的服務。所以我將原本的 Yaml 和昨天的範例整合。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
      # containerPort below must match the values file:
      #   nginx-ingress.controller.service.nodePorts.https
      # Change hostPort if port 443 is already in use.
      - containerPort: 32443
        hostPort: 443
        listenAddress: "0.0.0.0"
        # containerPort below must match the values file:
        #   nginx-ingress.controller.service.nodePorts.ssh
        # Using high-numbered hostPort assuming port 22 is
        #   already in use.
      - containerPort: 32022
        hostPort: 32022
        listenAddress: "0.0.0.0"
  - role: worker
  - role: worker
  - role: worker

GitLab

剩下到安裝的步驟都和昨天完全一致,這邊就不湊字數了。

部署完經過等待後,發現 gitlab-runner Pod 依然在不斷地重啟,而錯誤訊息為 ERROR: Registering runner... failed runner=ZidAqSx6 status=couldn't execute POST against https://gitlab.<my ip>.nip.io/api/v4/runners: Post "https://gitlab.<my ip>.nip.io/api/v4/runners": net/http: TLS handshake timeout PANIC: Failed to register the runner.

從錯誤訊息上我們可以得知是 gitlab-runner 不斷地嘗試透過 GitLab API 來註冊,但是一直打不通而失敗。

Debug Ingress

既然是 GitLab API 打不通,我就先嘗試用瀏覽器看看我們的 GitLab 是否有成功運作?
結果沒辦法連上。

這個網路服務是 Ingress 所提供的,所以我們往前排查。先確認它後面是什麼服務?
從該 Ingress:gitlab-webservice-default 的 Yaml 中可以得知,背後是相同名字的 Service。

backend:
  service:
    name: gitlab-webservice-default
    port:
      number: 8181

Service

我使用 Port-Forward 來將該 Service 的 8181 Port 映射到我主機的隨機一個 Port,結果發現服務是正常的。
https://ithelp.ithome.com.tw/upload/images/20240923/20141794Ffcmu6QJss.png

雖然很疑惑,但我們現在至少知道問題可能來自於 Ingress 本身了。

Nginx-Ingress

我們從 GitLab 的 Helm Chart 範例中可以發現有安裝一個服務名為 Nginx-Ingress,它是 Kubernetes 的一種 Ingress Controller,負責提供 Ingress 服務。既然 Ingress 出問題了,那我只能把目光放在它身上了。

在建立集群時,我們有設定 Control-Plane Node 有將 ContainerPort 映射到 HostPort 上。開始思考是否是因為 Nginx-Ingress Pod 沒有被安裝在 Control-Plane Node 上所導致 Ingress 無法正常運作?進而導致 GitLab API 打不通?

去檢查後發現確實被安裝在 Worker Nodes 上,將 Control-Plane Node 的 Taints 取消,並且指定 Nginx-Ingress Pod 要部署到 Control-Plane Node 上後,果然成功了!!!

為什麼昨天沒這問題?

因為昨天只有一個 Control-Plane Node 而沒有 Worker Nodes,所以我猜這時候應該不會存在 NoSchedule 的 Taint,而今天我新增了三個 Worker Nodes 才造成該問題。


上一篇
Day 08:Developing for Kubernetes with KinD (2)
下一篇
Day 10:Taints
系列文
在Local建立完整的開發環境筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言